package com.generics;


import com.sun.prism.shader.AlphaOne_ImagePattern_Loader;

import java.util.ArrayList;
import java.util.List;

//抑制警告
@SuppressWarnings({"all"})
public class Generic01 {
    public static void main(String[] args) {
        //ArrayList arrayList = new ArrayList();
        //使用泛型
        //1.当我们 ArrayList<Dog> 表示存放到ArrayList 集合中的元素是Dog类型
        //2.如果编译器发现添加的类型不满足要求，就回报错
        //3.在遍历的时候，可以直接取出Dog类型，而不是Object
        //ArrayList<Dog> arrayList = new ArrayList<Dog>();

        ArrayList<Gen> arrayList = new ArrayList<Gen>();
        arrayList.add(new Gen<>(new Dog("旺财",10)));
        arrayList.add(new Gen<>(new Dog("toby",2)));

        arrayList.add(new Gen<>(new Cat("招财猫",8)));

        for(Gen item: arrayList){
            System.out.println(item.toString());
        }

        //给泛型指向的数据，要求是引用类型，不能是基本数据类型。
        List<Integer> list = new ArrayList<>();
        //List<int> list1 = new ArrayList<>();
        //因为泛型E 指定了Anima，构造器传入了 new Anima
        //在给泛型指定具体的类型后，可以传入该类型或者其子类型，如 Dog、Cat
        //Gen<Anima> animaGen = new Gen<Anima>(new Anima("动物",8));
        //在实际开发中 推荐简写new Gen<Anima> ==》new Gen<>
        Gen<Anima> animaGen = new Gen<>(new Anima("动物",8));
        System.out.println(animaGen.toString());
        Gen<Dog> dogGen = new Gen<Dog>(new Dog("狗狗",10));
        System.out.println(dogGen.toString());
        Gen<Cat> catGen = new Gen<Cat>(new Cat("猫猫",8));
        System.out.println(catGen.toString());

    }
}

//自定义泛型类/接口
//1.普通成员可以使用泛型（属性、方法）
//2.使用泛型的数组，不能初始化
//3.静态方法中不能使用类的泛型
//4.泛型类的类型，是在创建对象时确定的（因为创建对象时，需要指定确定类型）
//5.如果在创建对象时，没有指定类型，默认为Object
class Gen<E>{
    E s;

    public Gen(E s) {
        this.s = s;
    }

    @Override
    public String toString() {
        return "Gen{" +
                "s=" + s +
                '}';
    }
}

class Anima{
    private String name;
    private  Integer age;
    public   Anima(String name, Integer age){
        this.name = name;
        this.age = age;
    }



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


class Dog extends   Anima {


    public Dog(String name, Integer age) {
        super(name, age);
    }

    @Override
    public String toString() {
        return "Dog{} 汪汪汪 " + super.toString();
    }


}

class Cat  extends   Anima {

    public Cat(String name, Integer age) {
        super(name, age);
    }

    @Override
    public String toString() {
        return "Cat{} 喵喵喵" + super.toString();
    }
}